現在我們已經認識了組合語言,也學會了如何看懂反組譯的結果,因此,我們今天就要來介紹一個非常強大的反組譯工具──IDA Pro 並學習如何用它來對惡意程式進行進一步的靜態分析,當然我們也可以用其他像是 Ghidra 等反組譯工具,不過這邊主要以 IDA 來介紹。
如果你很有錢的話可以直接去買,或者下載免費版的 IDA Free,這邊就直接使用之前拿到的 IDA Pro。
IDA Pro 會對整個程式進行反組譯,並執行許多工作,例如函式辨識、stack 分析、區域變數辨識等等。
其中 IDA Pro 的「快速函式庫識別與辨識技術」(Fast Library Identification and Recognition Technology,FLIRT)內建了大量的程式碼特徵簽章(code signatures),讓它能夠辨識反組譯後的函式並為其加上名稱。這項功能尤其適合辨識由編譯器加入程式中的函式庫程式碼。
IDA Pro 的設計本來就是為了讓使用者進行互動式分析,因此反組譯過程中的各個部分都可以由使用者修改、操作、重新排列或重新定義。
IDA Pro 最實用的功能之一,就是可以儲存分析的進度,我們可以加入註解、為資料加上標籤,以及替函式命名,接著將這些分析結果儲存在 IDA Pro 的資料庫中(稱為 idb),之後就可以重新開啟並繼續先前的分析工作。
IDA Pro 也提供了強大的 plug-in 支援,我們可以自行撰寫擴充功能,也可以利用其他人已經開發完成的工具。
以下根據課本教材介紹如何使用 IDA Pro 進行惡意程式分析,如果要更深入學習 IDA Pro 可以參考 Chris Eagle 所著的《The IDA Pro Book: The Unofficial Guide to the World’s Most Popular Disassembler, 2nd Edition》,裡面針對 IDA Pro 和逆向工程有更詳細的介紹。
既然我們要用 IDA Pro 進行惡意程式分析,那麼首先第一步當然就是要先把檔案給丟進去

上圖是把一個可執行檔載入 IDA Pro 時的第一個畫面,IDA Pro 會嘗試辨識檔案的格式及處理器架構,以圖中來說,IDA Pro 辨識出這個檔案採用 PE 格式 ❶,處理器架構則是 Intel x86 ❷。除非是要分析手機上的惡意程式,否則通常不太需要修改處理器類型。(手機惡意程式經常是在各種不同的平台上建立的。)
將一個檔案載入 IDA Pro 時(例如 PE 檔案),IDA Pro 會把這個檔案映射(map)到記憶體中,就好像它真的被作業系統的載入器(operating system loader)載入了一樣。
如果要讓 IDA Pro 將檔案視為原始二進位檔案(raw binary)來進行反組譯,可以在最上方的選項框中選擇 Binary File,如 ❸ 所示。這個選項非常實用,因為惡意程式有時會在合法的 PE 檔案後面附加一些額外內容,例如 shellcode、額外資料、加密參數,甚至是其他可執行檔。當 Windows 執行這個惡意程式時,這些額外附加的資料並不一定會被載入記憶體;同樣地,當 IDA Pro 以正常 PE 檔案的方式載入它時,這些資料也可能不會被載入。此外,如果是正在載入一個包含 shellcode 的 raw binary 檔案,也應該選擇將它作為 Binary File 載入,然後再進行反組譯。
PE 檔案在編譯時,通常會設定一個希望被載入記憶體的「偏好基底位址」(preferred base address)。如果 Windows Loader 無法把它載入到這個偏好的位址,例如該記憶體位址已經被其他東西占用,那麼 Loader 就會執行一個稱為「重定位基址」(rebasing)的操作。這種情況最常發生在 DLL,因為 DLL 經常會被載入到與原本 preferred address 不同的位置。如果你發現某個 DLL 實際載入 Process 後的記憶體位置,和你在 IDA Pro 裡看到的位置不同,那麼原因可能就是這個檔案被 rebased 了。
當這種情況發生時,可以勾選圖 5-1 中 ❹ 所示的 Manual Load 選項。接著你會看到一個輸入框,可以在其中指定新的虛擬基底位址(virtual base address),讓 IDA Pro 以這個新的位址載入檔案。在預設情況下,IDA Pro 不會把 PE Header 或 Resource Sections 包含在它的反組譯分析中,而這些地方正是惡意程式經常用來隱藏惡意程式碼的位置。如果指定使用 Manual Load,IDA Pro 就會逐一詢問你是否要載入每個 Section,其中也包括 PE File Header。如此一來,這些區域就不會在分析過程中被忽略。
當我們將程式載入完成以後,就會看到反組譯的視窗,也就是操控與分析惡意程式的地方,我們可以選擇兩種視窗:圖形視窗和文字視窗。要切換的話按空白鍵就好了。

在 Graph Mode 中,箭頭的顏色以及方向,可以在分析過程中幫助理解程式的執行流程。箭頭的顏色可以說明某條執行路徑是否取決於某個特定條件的判斷結果:
箭頭的方向則可以顯示程式的執行流程;其中,向上的箭頭通常表示程式中存在迴圈(loop)的情況。在 Graph Mode 中反白選取某段文字時,IDA Pro 也會將反組譯視窗中所有相同文字的出現位置一起反白顯示。

反組譯視窗中的 Text Mode 是一種比較傳統的顯示方式,而且如果想查看二進位檔案中的資料區域(data regions),就必須使用 Text Mode。
上圖顯示了一個已經反組譯函式的 Text Mode 畫面,它會顯示 opcode 在記憶體中所在的記憶體位址(0040105B)以及所在的 Section 名稱(.text),同時也會顯示該位置的 opcode(83EC18)❶。
Text Mode 畫面左側的區域稱為 Arrows Window(箭頭視窗),它用來顯示程式的非線性執行流程(nonlinear flow)。實線(solid lines)表示無條件跳躍(unconditional jumps),虛線(dashed lines)表示條件跳躍(conditional jumps)。 朝上的箭頭則表示迴圈(loop)。
這個範例中還包含了該函式的 Stack Layout(堆疊配置)❷,以及一段由 IDA Pro 自動加入的註解(comment)❸;註解會以分號(;)作為開頭。
圖形與文字模式在分析時都很常用到,而他們也有各自的用途
| Graph Mode | Text Mode |
|---|---|
| 像流程圖 | 像傳統 Assembly listing |
| Basic Block 一格一格顯示 | Assembly 從上到下排列 |
| 箭頭直接連接 Block | 左側 Arrows Window 顯示跳躍 |
| 適合看控制流程 | 適合仔細看指令、位址、資料 |
| 主要用來分析 Code | Code 和 Data 都方便查看 |
IDA Pro 還提供了其他幾個視窗,用來顯示執行檔中的特定項目,以下是對分析而言最重要的幾個視窗。
這個視窗會列出執行檔中的所有函式,並顯示每個函式的長度,並且可以按照函式長度進行排序,並從中篩選出較大、較複雜,而且可能比較值得分析的函式,同時排除那些非常小的函式。
這個視窗也會替每個函式標示一些 flags,例如 F、L、S 等。其中最實用的是 L,它代表 Library Function。L flag 可以幫助節省分析時間,因為可以藉此辨識並略過這些由編譯器產生的函式。
這個視窗會列出所有具有名稱的位址,其中包括函式、已命名的程式碼、已命名的資料以及字串。
這個視窗會顯示所有字串,預設情況下,這個列表只會顯示長度超過 5 個字元的 ASCII 字串,我們可以在 Strings Window 中按下滑鼠右鍵,然後選擇 Setup 來修改這項設定。
這個視窗會列出檔案中的所有 Imports。
這個視窗會列出檔案中的所有 Exported Functions,在分析 DLL 時,這個視窗特別實用。
這個視窗會列出所有目前啟用中的資料結構的配置方式,這個視窗也允許建立自己的資料結構,並將它們作為記憶體配置的範本使用。
以上這些視窗也提供 Cross-reference(交叉參照)功能,這項功能在尋找值得注意的程式碼時特別實用。例如,如果你想找出程式中所有呼叫某個 Import Function 的程式碼位置,你可以先使用 Imports Window,雙擊你感興趣的 Import Function,接著使用 Cross-reference 功能,在程式碼列表中找出所有使用或呼叫這個 Import 的位置。
今天是 IDA Pro 的基本介紹,我們認識了 IDA 的功能、使用方法與介面,明天會介紹更多使用 IDA 分析的細節並使用樣本實際示範!
